package com.pig4cloud.pig.common.core.enums;

import lombok.AllArgsConstructor;

import static cn.hutool.core.util.StrUtil.isNotBlank;
import static cn.hutool.core.util.StrUtil.replace;
import static com.pig4cloud.pig.common.core.util.DesensitizedUtils.*;

/**
 * 敏感信息枚举类
 *
 * @author mayee
 * @version v2.0
 * @upate lw
 **/
@AllArgsConstructor
public enum SensitiveTypeEnum {

    /**
     * 自定义 脱敏格式
     */
    CUSTOMER {
        @Override
        public String sensitive(int prefix, int suffix, String data, String maskStr) {
            return desValue(data, prefix, suffix, maskStr);
        }
    },

    /**
     * 用户名, 刘*华, 徐*
     */
    CHINESE_NAME {
        @Override
        public String sensitive(int prefix, int suffix, String data, String maskStr) {
            return chineseName(data);
        }
    },

    /**
     * 身份证号, 110110********1234
     */
    ID_CARD {
        @Override
        public String sensitive(int prefix, int suffix, String data, String maskStr) {
            return replace(data, 6, data.length() - 4, isNotBlank(maskStr) ? maskStr.charAt(0) : '*');
        }
    },

    /**
     * 座机号, ****1234
     */
    FIXED_PHONE {
        @Override
        public String sensitive(int prefix, int suffix, String data, String maskStr) {
            return replace(data, 0, data.length() - 4, isNotBlank(maskStr) ? maskStr.charAt(0) : '*');
        }
    },

    /**
     * 手机号, 176****1234
     */
    MOBILE_PHONE {
        @Override
        public String sensitive(int prefix, int suffix, String data, String maskStr) {
            return replace(data, 3, data.length() - 5, isNotBlank(maskStr) ? maskStr.charAt(0) : '*');
        }
    },

    /**
     * 地址, 北京********
     */
    ADDRESS {
        @Override
        public String sensitive(int prefix, int suffix, String data, String maskStr) {
            return address(data);
        }
    },

    /**
     * 电子邮件, s*****o@xx.com
     */
    EMAIL {
        @Override
        public String sensitive(int prefix, int suffix, String data, String maskStr) {
            return replace(data, 1, data.length() - 6, isNotBlank(maskStr) ? maskStr.charAt(0) : '*');
        }
    },

    /**
     * 银行卡, 622202************1234
     */
    BANK_CARD {
        @Override
        public String sensitive(int prefix, int suffix, String data, String maskStr) {
            return replace(data, 4, data.length() - 4, isNotBlank(maskStr) ? maskStr.charAt(0) : '*');
        }
    },

    /**
     * 密码, 永远是 ******, 与长度无关
     */
    PASSWORD {
        @Override
        public String sensitive(int prefix, int suffix, String data, String maskStr) {
            return replace(data, 0, data.length(), isNotBlank(maskStr) ? maskStr.charAt(0) : '*');
        }
    },

    /**
     * 密钥, 永远是 ******, 与长度无关
     */
    KEY {
        @Override
        public String sensitive(int prefix, int suffix, String data, String maskStr) {
            return replace(data, 0, data.length() - 3, isNotBlank(maskStr) ? maskStr.charAt(0) : '*');
        }
    };


    /**
     * 获取脱敏后的结果
     *
     * @param prefix  脱敏开始位置
     * @param suffix  脱敏结束位置
     * @param data    脱敏原的数据
     * @param maskStr 脱敏的替换标识
     * @return 脱敏后的数据
     */
    public abstract String sensitive(int prefix, int suffix, String data, String maskStr);


}
